<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script>
        var str = 'abc';
        str.slice(1);
        console.log(str.a = 200); //200
        str.b = 200;
        console.log(str.b); //undefined
        // 包装对象
        // 当一个基本类型的值去访问属性或方法时
        // 会被临时包装成一个对象（new String(str)）
        // 调用完属性或方法后，该对象就被销毁了

        // 对象
        var movie = {
            name : '长津湖',
            rating: 9.9,
            time: '10-1',
            showName: function(){
                console.log(this.name)
            }
        }
        var movie2 = {
            name : '我和我的父辈',
            rating: 9.6,
            time: '10-2'
        }

        // 包装成函数
        //工厂方法
        function createMovie(name,rating,time){
            var mov = {}; //原料
            mov.name = name; //加工
            mov.rating = rating;
            mov.time = time;
            mov.showName = function(){
                console.log(this.name);
            }
            return mov; //输出
        }
        var m1 = createMovie('长津湖1',9.9,'10-1');
        var m2 = createMovie('长津湖2',9.9,'10-1');
        var m3 = createMovie('长津湖3',9.9,'10-1');
        var m4 = createMovie('长津湖4',9.9,'10-1');
        console.log(m1.showName());
        console.log(m2);

        // 构造函数，创建对象
        // 使用 function 关键字声明
        // 为了区别普通函数，构造函数首字母大写
        // 在构造函数中，this 指代实例对象
        // 通过 this 定义和访问实例对象的属性和方法
        // 通过 new 关键字调用构造函数
        // new 关键字的作用
        // 创建原料:  隐式创建一个空对象，并且 this 指代这个空对象
        // 产品输出:  隐式将加工过的对象 return 返回
        function Movie(name,rating,time){
            this.name = name; //加工
            this.rating = rating;
            this.time =time;
            this.showName = function(){      //两个内存
                console.log(this.name);
            }
        }
        // // prototype为扩展 节省内存
        // Movie.prototype.showName = function(){      //类似于继承
        //     console.log(this.name);
        // }
        var m1 = new Movie('长津湖1',9.9,'10-1'); //原料和输出
        var m2 = new Movie('长津湖2',9.9,'10-1');
        console.log(m1);
        console.log(m2);
        // m1.showName();
        // console.log(m1.showName === m2.showName); //在一个内存   

        // 构造函数相当于模板，使用 new 关键字创建实例对象
        // 构造函数调用时，this 指向创建的实例对象

        // 内置对象
        // Math
        var num = Math.round(5.8); // 四舍五入
        console.log(num);
        // 0-100随机数
        var ran = Math.random()*100;
        console.log(ran);
        // 0-100随机整数
        var ran = Math.random()*100;
        console.log(Math.round(ran));
        // 50-100随机整数
        var ran = 50+Math.random()*50;
        console.log(Math.round(ran));
        // [0,1)
        var ran = Math.random();
        console.log(ran.toFixed(2)); //保留两位小数

        console.log(Math.ceil(4.4)); //向上取整 取5
        console.log(Math.floor(4.4)); //向下取整 取4

        // Array
        var arr1 = new  Array(1,2,3);
        console.log(arr1);      // 方法在原型上 不在自身 否则会占内存过大
        // 自身在原型上加方法
        var arr1 = [2,5,8];
        Array.prototype.a = function(fn){        //与map效果相同 a是方法名
            var a = [];
            for (var i=0; i<this.length;i++){
                a.push( fn(this[i],i) );        //this是谁调用 就是谁 即arr1
            }
            return a;
        }
        console.log(arr1.a(function(item){return item+100}));

        // Date
        // 每隔一秒中调用一次函数
        setInterval(function(){
            var date = new Date('2020/9/11')
            // date.setHours(10); //不是零点了 是10点
            var date2 = new Date();
            console.log(date);
            // getTime() 是获取1970年1月1日的毫秒数
            var num = date2.getTime()-date.getTime();
            console.log(num/1000/60/60/24); //天 小时 分钟 秒 毫秒
            console.log(num/1000%60);  //0-60秒 
        },1000)

        // getFullYear() 年份 1000-9999
        // getMonth()返回值是 0（一月） 到 11（十二月） 之间的一个整数。
        // getDate()所指的月份中的某一天，使用本地时间。返回值是 1 ~ 31 之间的一个整数。

        // getHours() 返回值是 0 （午夜） 到 23 （晚上 11 点）之间的一个整数。
        // getMinutes() 返回值是 0 ~ 59 之间的一个整数
        // getSeconds() 返回值是 0 ~ 59 之间的一个整数。


        // JavaScript 数据类型
        // 原始类型
        // number、string、boolean、null、undefined
        // 对象类型
        // 对象具有属性和方法
        // 除了 undefined，JavaScript的一切都是对象或者可以看成对象


    </script>
</body>
</html>